package org.example.stack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * 用两个栈实现队列
 * @author Abner G
 * @date 2022/3/17 21:14
 */
public class practiceStack01 {


    /**
     *题目
     *用两个栈来实现一个队列，完成队列的 Push 和 Pop 操作。
     * https://github.com/CyC2018/CS-Notes/blob/master/notes/9.%20%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.md
     *
     */
    public static void main(String[] args) {
        final MyQueue myQueue = new MyQueue();
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        for (Integer integer : integers) {
            myQueue.push(integer);
        }
        for (Integer integer : integers) {
            System.out.println(myQueue.pop());
        }


    }


    /**
     * 解题思路：
     * 题目关键点：栈，队列
     * 栈特点：先进后出
     * 队列特点：先进先出
     * in 栈用来处理入栈（push）操作，
     * out 栈用来处理出栈（pop）操作。
     * 一个元素进入 in 栈之后，出栈的顺序被反转。
     * 当元素要出栈时，需要先进入 out 栈，
     * 此时元素出栈顺序再一次被反转，
     * 因此出栈顺序就和最开始入栈顺序是相同的，
     * 先进入的元素先退出，这就是队列的顺序。
     *
     * 正序进(A)->倒序出(A)->倒序进（B）->正序出（B）
     */


}


class MyQueue{


    private Stack<Integer> in = new Stack<Integer>();

    private Stack<Integer> out = new Stack<Integer>();


    public MyQueue() {
    }

    public void push(int node) {
        in.push(node);
    }

    public Integer pop(){
        if (out.isEmpty()){
            // 关键点
            while (!in.isEmpty()){
                out.push(in.pop());
            }
        }
        if (out.isEmpty()){
            return null;
        }
        return out.pop();
    }



}
